package homework.mission1;

import java.util.Arrays;
import java.util.Scanner;

public class MatrixHandle {
    public static void main(String[] args) {
        /**
         * 创建一个行数为16，列数为16的整形二维数组(矩阵)
         */
        int[][] matrix = new int[16][16];

        /**
         * 获取用户输入对象, 声明循环判断变量, 以及用户的选择
         */
        Scanner sc = new Scanner(System.in);
        boolean loop = true;
        String select = "";

        while(loop) {
            System.out.println("请输入您的选择");
            System.out.println("(1)请输入指定位置和元素的值");
            System.out.println("(2)指定所有位置元素的值");
            System.out.println("(3)计算所有行和所有列的元素值的累加和");
            System.out.println("(4)计算二维数组中从左上角到右下角元素的和");
            System.out.println("(5)计算二维数组中从右上角到左下角元素的和");
            System.out.println("(e) exit");

            select = sc.next();

            switch (select) {
                case "1":
                    System.out.println("请输入指定的行和列 => 格式: 行数,列数");
                    String[] positionArr = sc.next().split(",");
                    if(positionArr.length < 2) {
                        System.out.println("行数,列数位置缺失，请重新选择");
                        break;
                    }

                    // 获取行和列，并判断值是否合理
                    int row = Integer.parseInt(positionArr[0]);
                    int column = Integer.parseInt(positionArr[1]);

                    if((row < 0) || (row >= 16) || (column < 0) || (column >= 16)) {
                        System.out.println("行数,列数 不符合要求, 请重新选择");
                        break;
                    }

                    System.out.println("请输入元素值");
                    int value = sc.nextInt();

                    // 修改二维数组中的值
                    matrix[row][column] = value;

                    // 打印数组
                    printMatrix(matrix);

                    break;
                case "2":
                    System.out.println("请输入您想填充的值");
                    int fillValue = sc.nextInt();

                    //填充
                    fillMatrix(matrix, fillValue);

                    //打印数组
                    printMatrix(matrix);

                    break;
                case "3":
                    int sum = getSum(matrix);
                    System.out.println("所有行和列元素的和是 " + sum);

                    break;
                case "4":
                    int leftRightSum = getLeftRightSum(matrix);
                    System.out.println("左上角到右下角元素的和是 " + leftRightSum);
                    break;
                case "5":
                    int rightLeftSum = getRightLeftSum(matrix);
                    System.out.println("右上角到左下角元素的和是 " + rightLeftSum);
                    break;
                case "e":
                    loop = false;
                    break;
                default:
                    System.out.println("输入有误，请重新输入");
            }
        }
    }

    /**
     * 打印二维数组
     * @param matrix
     */
    private static void printMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
    }

    /**
     * 填充二维数组
     * @param matrix
     * @param value
     */
    private static void fillMatrix(int[][] matrix, int value) {
        for (int i = 0; i < matrix.length; i++) {
            Arrays.fill(matrix[i], value);
        }
    }

    /**
     * 计算二维数组中所有行和列元素的和
     * @param matrix
     * @return
     */
    private static int getSum(int[][] matrix) {
        // 创建统计变量
        int sum = 0;
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                sum += matrix[i][j];
            }
        }

        return sum;
    }

    /**
     * 计算二维数组左上角到右下角元素的和
     * @param matrix
     * @return
     */
    private static int getLeftRightSum(int[][] matrix) {
        // 创建统计变量
        int sum = 0;

        for (int i = 0; i < matrix.length; i++) {
            sum += matrix[i][i];
        }

        return sum;
    }

    /**
     * 计算右上角到左下角的元素的和
     * @param matrix
     * @return
     */
    private static int getRightLeftSum(int[][] matrix) {
        // 创建统计变量
        int sum = 0;

        for (int i = 0; i < matrix.length; i++) {
            int j = matrix[i].length - 1;
            j -= i;
            sum += matrix[i][j];
        }

        return sum;
    }
}
